home *** CD-ROM | disk | FTP | other *** search
/ Wayzata's Best of Shareware PC/Windows 2 / Wayzata's Best of Shareware 2.0 (Windows) (Wayzata Technology)(7112)(1994).bin / pc / dos / telecomm / pccp047 / session.c < prev    next >
C/C++ Source or Header  |  1992-08-14  |  7KB  |  349 lines

  1. /*    Copyright (C) 1992 Peter Edward Cann, all rights reserved.
  2.  *    MicroSoft QuickC
  3.  */
  4.  
  5. #include<stdio.h>
  6. #include<bios.h>
  7. #include<dos.h>
  8. #include<fcntl.h>
  9. #include<sys\types.h>
  10. #include<sys\stat.h>
  11. #include<signal.h>
  12. #include<process.h>
  13. #include"port.h"
  14.  
  15. sendchar(c)
  16.     unsigned char c;
  17.     {
  18.     while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)))
  19.         if(kbhit())
  20.             getch();
  21.     outp(basereg, c);
  22.     }
  23.  
  24. int follow;
  25.  
  26. quit()
  27.     {
  28.     cleanup(0);
  29.     exit(99);
  30.     }
  31.  
  32. sendstr(str)
  33.     char *str;
  34.     {
  35.     int i;
  36.     for(i=0;str[i]!='\0';++i)
  37.         if(str[i]=='\n')
  38.             {
  39.             sendchar('\r');
  40.             sendchar('\n');
  41.             }
  42.         else
  43.             sendchar(str[i]);
  44.     }
  45.  
  46. portgets(str)
  47.     char *str;
  48.     {
  49.     int i;
  50.     i=0;
  51.     while(i<255)
  52.         {
  53.         while(follow==index)
  54.             {
  55.             if(!(inp(basereg+MSTATREG)&DCDMASK))
  56.                 return(-1);
  57.             if(kbhit())
  58.                 getch();
  59.             }
  60.         str[i]=buf[follow++];
  61.         follow%=TBUFSIZ;
  62.         if(str[i]=='\b')
  63.             if(i>0)
  64.                 {
  65.                 i-=2;
  66.                 sendchar('\b');
  67.                 sendchar(' ');
  68.                 sendchar('\b');
  69.                 }
  70.             else
  71.                 {
  72.                 i--;
  73.                 sendchar(0x07);
  74.                 }
  75.         else
  76.             sendchar(str[i]);
  77.         if((str[i]=='\r')||(str[i]=='\n'))
  78.             {
  79.             sendchar('\r');
  80.             sendchar('\n');
  81.             str[i]='\0';
  82.             break;
  83.             }
  84.         i++;
  85.         }
  86.     str[255]='\0';
  87.     return(0);
  88.     }
  89.         
  90. getlegalpath(str, dirstr)
  91.     char *str, *dirstr;
  92.     {
  93.     char str1[256];
  94.     int i;
  95.     if(portgets(str1)==-1)
  96.         return(-1);
  97.     if(dirstr[0])
  98.         {
  99.         for(i=0;i<255;++i)
  100.             {
  101.             if(str1[i]=='\0')
  102.                 break;
  103.             if((str1[i]=='.')&&(str1[i+1]=='.'))
  104.                 {
  105.                 str[0]='\0';
  106.                 return(0);
  107.                 }
  108.             }
  109.         sprintf(str, "%s\\%s", dirstr, str1);
  110.         }
  111.     else
  112.         strcpy(str, str1);
  113.     }
  114.  
  115. main(argc, argv)
  116.     int argc;
  117.     char **argv;
  118.     {
  119.     long timestamp;
  120.     int i, j, outfd, ok, c, run, result;
  121.     char str[256], udir[256], ddir[256];
  122.     index=follow=0;
  123.     printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.\n");
  124.     if(!strcmp(getenv("REMOTE"), "YES"))
  125.         {
  126.         printf("You appear to be already logged in remotely, judging by the environment\n");
  127.         printf("variable REMOTE, so this is probably a very bad idea.\n");
  128.         printf("Are you sure you want to run SESSION? (y or n) --> ");
  129.         if(getchar()!='y') /* Note getchar() and not getch()! */
  130.             {
  131.             printf("I didn't think so!\n");
  132.             exit(99);
  133.             }
  134.         else
  135.             printf("OK, you're the boss!");
  136.         }
  137.     printf("Control-C to Exit.\n");
  138.     if((argc!=5)&&(argc!=3))
  139.         {
  140.         printf("USAGE: session <comnum> <bps> [<download dir> <upload dir>]\n");
  141.         exit(1);
  142.         }
  143.     if(argc==5)
  144.         {
  145.         strcpy(ddir, argv[3]);
  146.         strcpy(udir, argv[4]);
  147.         }
  148.     else
  149.         {
  150.         ddir[0]='\0';
  151.         udir[0]='\0';
  152.         }
  153.     comnum=atoi(argv[1])-1;
  154.     speed=atoi(argv[2]);
  155.     databits='8';
  156.     parity='n';
  157.     stopbits='1';
  158.     setport();
  159.     readset();
  160.     setup();
  161.     signal(SIGINT, quit);
  162.     run=1;
  163.     while(run)
  164.         {
  165.         sendstr("\n\n     DOWNLOAD:  (1) Xmodem   (2) Xmodem CRC   (3) Xmodem CRC 1K\n\n");
  166.         sendstr("       UPLOAD:  (4) Xmodem   (5) Xmodem CRC 1K Optional\n\n");
  167.         if(argc==5)
  168.             sendstr("                   (q) Quit\n\n             ---> ");
  169.         else
  170.             sendstr("                 (s) Shell        (q) Quit\n\n             ---> ");
  171.         while(index==follow)
  172.             {
  173.             if(!(inp(basereg+MSTATREG)&DCDMASK))
  174.                 {
  175.                 run=0;
  176.                 break;
  177.                 }
  178.             if(kbhit())
  179.                 getch();
  180.             }
  181.         if(!run)
  182.             break;
  183.         c=buf[follow++];
  184.         follow%=TBUFSIZ;
  185.         switch(c)
  186.             {
  187.             case 'q':
  188.             case 'Q':
  189.                 sendstr("Quit\n");
  190.                 run=0;
  191.                 break;
  192.             case 's':
  193.             case 'S':
  194.                 if(argc==5)
  195.                     {
  196.                     sendstr("Shell not available with restricted directory.\n");
  197.                     break;
  198.                     }
  199.                 sendstr("Shell\n");
  200.                 printf("Entering command.com remote shell.\n");
  201.                 sprintf(str, "COM%d", comnum+1);
  202.                 putenv("PROMPT=REMOTE>$p$g");
  203.                 putenv("REMOTE=YES");
  204.                 cleanup(INHCTL);
  205.                 spawnlp(P_WAIT, "c:\\command.com", "command.com", str, "/e:01024", NULL);
  206.                 putenv("REMOTE=NO");
  207.                 setup();
  208.                 break;
  209.             case '1':
  210.                 sendstr("Xmodem Download.\nSource file pathname? (Blank to cancel)\n --> ");
  211.                 if((result=getlegalpath(str, ddir))==-1)
  212.                     {
  213.                     run=0;
  214.                     break;
  215.                     }
  216.                 if(!strlen(str))
  217.                     break;
  218.                 cleanup(INHCTL);
  219.                 result=spawnlp(P_WAIT, "xmodems", "xmodems", argv[1], argv[2], "1", str, NULL);
  220.                 setup();
  221.                 sendstr("Press any key to continue: --> ");
  222.                 while(follow==index)
  223.                     {
  224.                     if(!(inp(basereg+MSTATREG)&DCDMASK))
  225.                         {
  226.                         run=0;
  227.                         break;
  228.                         }
  229.                     if(kbhit())
  230.                         getch();
  231.                     }
  232.                 follow=index;
  233.                 sprintf(str, "Exit code = %d.\n", result);
  234.                 sendstr(str);
  235.                 break;
  236.             case '2':
  237.                 sendstr("Xmodem CRC Download.\nSource file pathname? (Blank to cancel)\n --> ");
  238.                 if((result=getlegalpath(str, ddir))==-1)
  239.                     {
  240.                     run=0;
  241.                     break;
  242.                     }
  243.                 if(!strlen(str))
  244.                     break;
  245.                 cleanup(INHCTL);
  246.                 result=spawnlp(P_WAIT, "xmcrcs", "xmcrcs", argv[1], argv[2], "1", str, NULL);
  247.                 setup();
  248.                 sendstr("Press any key to continue: --> ");
  249.                 while(follow==index)
  250.                     {
  251.                     if(!(inp(basereg+MSTATREG)&DCDMASK))
  252.                         {
  253.                         run=0;
  254.                         break;
  255.                         }
  256.                     if(kbhit())
  257.                         getch();
  258.                     }
  259.                 follow=index;
  260.                 sprintf(str, "Exit code = %d.\n", result);
  261.                 sendstr(str);
  262.                 break;
  263.             case '3':
  264.                 sendstr("Xmodem CRC 1k Download.\nSource file pathname? (Blank to cancel)\n --> ");
  265.                 if((result=getlegalpath(str, ddir))==-1)
  266.                     {
  267.                     run=0;
  268.                     break;
  269.                     }
  270.                 if(!strlen(str))
  271.                     break;
  272.                 cleanup(INHCTL);
  273.                 result=spawnlp(P_WAIT, "xmcrc1ks", "xmcrc1ks", argv[1], argv[2], "1", str, NULL);
  274.                 setup();
  275.                 sendstr("Press any key to continue: --> ");
  276.                 while(follow==index)
  277.                     {
  278.                     if(!(inp(basereg+MSTATREG)&DCDMASK))
  279.                         {
  280.                         run=0;
  281.                         break;
  282.                         }
  283.                     if(kbhit())
  284.                         getch();
  285.                     }
  286.                 follow=index;
  287.                 sprintf(str, "Exit code = %d.\n", result);
  288.                 sendstr(str);
  289.                 break;
  290.             case '4':
  291.                 sendstr("Xmodem Upload.\nTarget file pathname? (Blank to cancel)\n --> ");
  292.                 if((result=getlegalpath(str, udir))==-1)
  293.                     {
  294.                     run=0;
  295.                     break;
  296.                     }
  297.                 if(!strlen(str))
  298.                     break;
  299.                 cleanup(INHCTL);
  300.                 result=spawnlp(P_WAIT, "xmodemr", "xmodemr", argv[1], argv[2], "1", str, NULL);
  301.                 setup();
  302.                 sendstr("Press any key to continue: --> ");
  303.                 while(follow==index)
  304.                     {
  305.                     if(!(inp(basereg+MSTATREG)&DCDMASK))
  306.                         {
  307.                         run=0;
  308.                         break;
  309.                         }
  310.                     if(kbhit())
  311.                         getch();
  312.                     }
  313.                 follow=index;
  314.                 sprintf(str, "Exit code = %d.\n", result);
  315.                 sendstr(str);
  316.                 break;
  317.             case '5':
  318.                 sendstr("Xmodem CRC Upload, 1k Optional.\nTarget file pathname? (Blank to cancel)\n --> ");
  319.                 if((result=getlegalpath(str, udir))==-1)
  320.                     {
  321.                     run=0;
  322.                     break;
  323.                     }
  324.                 if(!strlen(str))
  325.                     break;
  326.                 cleanup(INHCTL);
  327.                 result=spawnlp(P_WAIT, "xmcrc1kr", "xmcrc1kr", argv[1], argv[2], "1", str, NULL);
  328.                 setup();
  329.                 sendstr("Press any key to continue: --> ");
  330.                 while(follow==index)
  331.                     {
  332.                     if(!(inp(basereg+MSTATREG)&DCDMASK))
  333.                         {
  334.                         run=0;
  335.                         break;
  336.                         }
  337.                     if(kbhit())
  338.                         getch();
  339.                     }
  340.                 follow=index;
  341.                 sprintf(str, "Exit code = %d.\n", result);
  342.                 sendstr(str);
  343.                 break;
  344.             }
  345.         }
  346.     cleanup(INHCTL);
  347.     exit(0);
  348.     }
  349.